package GUI;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.ParseException;

import Baza.BazaDanych;
import Baza.DataFormats;
import Baza.Konfiguracja;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.MaskFormatter;
/**
 * Klasa okna logowania
 * Zawiera okno rejestracji oraz logowania klienta
 * Po zalogowaniu tworzony jest obiekt klasy OknoGlowne, ktory tworzy glowne onko aplikacji
 */
public class OknoLogowania extends JFrame{
	private static final long serialVersionUID = 7986718886781014267L;
	private JFrame frame;
	private JPanel cards; //Panel korzystający z kart
	private Konfiguracja konfiguracja = new Konfiguracja();
	
	public OknoLogowania() {
		createAndShowGUI();
	}
	
	private void addComponentToPane(Container pane){
		JPanel logoPane = getLogo();
		JPanel registerPane = getRegisterPane();
		JPanel loginPane = getLoginPane();
		
		cards = new JPanel(new CardLayout());
		cards.add(loginPane, konfiguracja.getLoginButton());
		cards.add(registerPane, konfiguracja.getRegisterButton());
		
		pane.add(logoPane, BorderLayout.EAST);
		pane.add(cards, BorderLayout.WEST);
	}
	
	private JFrame createAndShowGUI(){
		frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		addComponentToPane(frame.getContentPane());
		frame.pack();
		frame.setLocation(50, 50);
		frame.setResizable(false);
        frame.setVisible(true);
        frame.setTitle(konfiguracja.getAppTitle());
        
        return frame;
	}
	
	public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {
        for(UIManager.LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
        	if("Nimbus".equals(info.getName())){
        		UIManager.setLookAndFeel(info.getClassName());
        		break;
        	}
        }
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new OknoLogowania();
            }
        });
    }
	
	/**
	 * Tworzenie poszczególnych paneli GUI
	 */
	
	private JPanel getLogo(){
		final ImageIcon logo = new ImageIcon("Leki/logo.jpg");
		JPanel logoPane = new JPanel()  
        {  
            /**
			 * 
			 */
			private static final long serialVersionUID = 1L;

			protected void paintComponent(Graphics g)  
            {  
                Dimension d = getSize();
                g.drawImage(logo.getImage(), 0, 0, d.width, d.height, null);  
   
                super.paintComponent(g);  
            }  
        }; 
        logoPane.setOpaque( false );  
        logoPane.setPreferredSize(new Dimension(logo.getIconWidth(), logo.getIconHeight()));
        
        return logoPane;
	}
	
	/**
	 * REJESTRACJA
	 */
	private JTextField name, surname, address, rLogin, lLogin, email;
	private JFormattedTextField phone, pesel;
	private JPasswordField rPassword, lPassword;
	private JCheckBox rPracownik, lPracownik;
		
	private JPanel getRegisterPane(){
		JPanel panel = new JPanel(new GridBagLayout());
		name = new JTextField(12);
		surname = new JTextField(12);
		address = new JTextField(12);
		rLogin = new JTextField(12);
		email = new JTextField(12);
		email.setPreferredSize( new Dimension( konfiguracja.getFieldWidth(), konfiguracja.getFieldHeight()));
		phone = getPhoneField();
		pesel = getPeselField();
		rPassword = new JPasswordField(12);
		rPassword.setPreferredSize(new Dimension(konfiguracja.getFieldWidth(), konfiguracja.getFieldHeight()));
		rPracownik = new JCheckBox();
		JButton registerButton = getRegisterButton();
		JButton loginSwitch = getCardSwitch(konfiguracja.getLoginButton());	
		
		GridBagConstraints grid = new GridBagConstraints();
		grid.gridwidth = GridBagConstraints.REMAINDER;
		
		panel.add(new JLabel(konfiguracja.getRegisterButton()), grid);
		panel.add(new JLabel(konfiguracja.getLoginField()));
		panel.add(rLogin,grid);
		panel.add(new JLabel(konfiguracja.getPasswordField()));
		panel.add(rPassword,grid);
		panel.add(new JLabel(konfiguracja.getEmailField()));
		panel.add(email,grid);
		panel.add(new JLabel(konfiguracja.getNameField()));
		panel.add(name,grid);
		panel.add(new JLabel(konfiguracja.getSurnameField()));
		panel.add(surname,grid);
		panel.add(new JLabel(konfiguracja.getPeselField()));
		panel.add(pesel,grid);
		panel.add(new JLabel(konfiguracja.getPhoneField()));
		panel.add(phone,grid);
		panel.add(new JLabel(konfiguracja.getAddressField()));
		panel.add(address,grid);
		if(konfiguracja.getAdminEnable().equals("true")){
			panel.add(new JLabel(konfiguracja.getEmployeeField()));
			panel.add(rPracownik,grid);
		}
		panel.add(registerButton);
		panel.add(loginSwitch);
		
		return panel;
	}
	/**
	 * Tworzenie poszczególnych elementów panelu dla ekranu rejestracji
	 */
	private JFormattedTextField getPhoneField(){
		MaskFormatter phoneMask = null;
		try {
        	phoneMask = new MaskFormatter("###########");
        	phoneMask.setPlaceholderCharacter('_');
        } catch (ParseException e) {
            e.printStackTrace();
        }
		JFormattedTextField phone = new JFormattedTextField(phoneMask);
		phone.setPreferredSize(new Dimension(konfiguracja.getFieldWidth(), konfiguracja.getFieldHeight()));
		
		return phone;
	}
	private JFormattedTextField getPeselField(){
		MaskFormatter peselMask = null;
        try {
        	peselMask = new MaskFormatter("###########");
        	peselMask.setPlaceholderCharacter('_');
        } catch (ParseException e) {
            e.printStackTrace();
        }
        JFormattedTextField pesel = new JFormattedTextField(peselMask);
		pesel.setPreferredSize(new Dimension(konfiguracja.getFieldWidth(), konfiguracja.getFieldHeight()));
		
		return pesel;
	}
	private JButton getRegisterButton(){
		JButton register = new JButton(konfiguracja.getRegisterButton());
		register.addActionListener(new ActionListener() {
			@Override
			@SuppressWarnings("deprecation")
			public void actionPerformed(ActionEvent event) {
				JFrame errorFrame = null;
				BazaDanych database = new BazaDanych();
				if(name.getText().equals("")||surname.getText().equals("")||pesel.getText().equals("___________")||email.getText().equals("")||rLogin.getText().equals("")||rPassword.getText().equals("")||phone.getText().equals("___________")||address.getText().equals("")){
					JOptionPane.showMessageDialog(errorFrame, konfiguracja.getRegisterEmptyError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
				}else if(!DataFormats.isNumberLetter(rLogin.getText())){
					JOptionPane.showMessageDialog(errorFrame, konfiguracja.getLoginField()+konfiguracja.getNumberLetterTypeError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
				}else if(!DataFormats.isNumberLetter(rPassword.getText())){
					JOptionPane.showMessageDialog(errorFrame, konfiguracja.getPasswordField()+konfiguracja.getNumberLetterTypeError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
				}else if(!DataFormats.isMonkey(email.getText())){
					JOptionPane.showMessageDialog(errorFrame, konfiguracja.getEmailTypeError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
				}else if(!DataFormats.isLetter(name.getText())){
					JOptionPane.showMessageDialog(errorFrame, konfiguracja.getLetterTypeError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
				}else if(!DataFormats.isLetter(surname.getText())){
					JOptionPane.showMessageDialog(errorFrame, konfiguracja.getLetterTypeError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
				}else{
					if(rPracownik.isSelected()){
						if(database.checkLogin(rLogin.getText().trim(), true)){
							JOptionPane.showMessageDialog(errorFrame, konfiguracja.getLoginExistError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
						}else if(database.checkPesel(Long.parseLong(pesel.getText()), true)){
							JOptionPane.showMessageDialog(errorFrame, konfiguracja.getPeselExistError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
						}else{
							database.insertFarmaceuta(name.getText().trim(), surname.getText().trim(), Long.parseLong(pesel.getText().trim()), address.getText().trim(), email.getText().trim(), rLogin.getText().trim(), rPassword.getText().trim(), "Administrator");
						}
					}else{
						if(database.checkLogin(rLogin.getText().trim(), false)){
							JOptionPane.showMessageDialog(errorFrame, konfiguracja.getLoginExistError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
						}else if(database.checkPesel(Long.parseLong(pesel.getText()), false)){
							JOptionPane.showMessageDialog(errorFrame, konfiguracja.getPeselExistError(), konfiguracja.getErrorMessage(), JOptionPane.WARNING_MESSAGE);
						}else{
							database.insertKlient(name.getText().trim(), surname.getText().trim(), Long.parseLong(pesel.getText().trim()), address.getText().trim(), email.getText().trim(), rLogin.getText().trim(), rPassword.getText().trim());
						}
					}
				}
				database.closeConnection();
			}
		});
		return register;
	}
	
	/**
	 * LOGOWANIE
	 */
	private JPanel getLoginPane(){
		JPanel panel = new JPanel(new GridBagLayout());
		lLogin = new JTextField(12);
		lPassword = new JPasswordField(12);
		lPracownik = new JCheckBox();
		JButton loginButton = getLoginButton();
		JButton registerSwitch = getCardSwitch(konfiguracja.getRegisterButton());
		GridBagConstraints grid = new GridBagConstraints();  
	    grid.gridwidth = GridBagConstraints.REMAINDER;
	     
	    panel.add(new JLabel(konfiguracja.getLoginButton()),grid);
	    panel.add(new JLabel(konfiguracja.getLoginField()));
	    panel.add(lLogin,grid);
	    panel.add(new JLabel(konfiguracja.getPasswordField()));
	    panel.add(lPassword,grid);
	    panel.add(new JLabel(konfiguracja.getEmployeeField()));
	    panel.add(lPracownik,grid);
	    panel.add(loginButton);
	    panel.add(registerSwitch);
	     
		return panel;
	}
	
	private JButton getLoginButton(){
		JButton button = new JButton(konfiguracja.getLoginButton());
		button.addActionListener(new ActionListener() {
			
			@Override
			@SuppressWarnings("deprecation")
			public void actionPerformed(ActionEvent arg0) {
				JFrame errorFrame = null;
				BazaDanych database = new BazaDanych();
				if(lPracownik.isSelected()){
					if(database.checkLogin(lLogin.getText().trim(), lPassword.getText().trim(), true)){
						new OknoGlowne(database.selectFarmaceuta(lLogin.getText().trim()));
						frame.dispose();
					}else{
						JOptionPane.showMessageDialog(errorFrame, konfiguracja.getLoginError(), konfiguracja.getErrorMessage(), JOptionPane.ERROR_MESSAGE);
					}
				}else{
					if(database.checkLogin(lLogin.getText().trim(), lPassword.getText().trim(), false)){
						new OknoGlowne(database.selectKlient(lLogin.getText().trim()));
						frame.dispose();
					}else{
						JOptionPane.showMessageDialog(errorFrame, konfiguracja.getLoginError(), konfiguracja.getErrorMessage(), JOptionPane.ERROR_MESSAGE);
					}
				}
				database.closeConnection();
			}
		});
		return button;
	}
	
	/**
	 * Przycisk przelaczajacy miedzy kartami
	 * @param card
	 * @return
	 */
	private JButton getCardSwitch(final String card){
		JButton button = new JButton(card);
		button.addActionListener(new ActionListener() {
			@Override
	    	public void actionPerformed(ActionEvent event) {
	    		CardLayout cl = (CardLayout)(cards.getLayout());
	    		cl.show(cards, card);
	    		}
	    	}
	    );
		return button;
	}
}